#
#  Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
#
import os
import logging
from api.utils import get_base_config, decrypt_database_config
from api.utils.file_utils import get_project_base_directory

# Server
# 定义RAG配置文件的路径变量，指向项目基础目录下的conf文件夹
RAG_CONF_PATH = os.path.join(get_project_base_directory(), "conf")

# Get storage type and document engine from system environment variables
# 根据系统环境变量获取存储类型和文档引擎
STORAGE_IMPL_TYPE = os.getenv('STORAGE_IMPL', 'MINIO')
DOC_ENGINE = os.getenv('DOC_ENGINE', 'elasticsearch')

# 初始化各种可能使用的配置字典
ES = {}
INFINITY = {}
AZURE = {}
S3 = {}
MINIO = {}
OSS = {}
OS = {}

# Initialize the selected configuration data based on environment variables to solve the problem of initialization errors due to lack of configuration
# 根据环境变量初始化相应的配置数据，以解决由于缺少配置而导致的初始化错误问题
if DOC_ENGINE == 'elasticsearch':
    ES = get_base_config("es", {})
elif DOC_ENGINE == 'opensearch':
    OS = get_base_config("os", {})
elif DOC_ENGINE == 'infinity':
    INFINITY = get_base_config("infinity", {"uri": "infinity:23817"})

if STORAGE_IMPL_TYPE in ['AZURE_SPN', 'AZURE_SAS']:
    AZURE = get_base_config("azure", {})
elif STORAGE_IMPL_TYPE == 'AWS_S3':
    S3 = get_base_config("s3", {})
elif STORAGE_IMPL_TYPE == 'MINIO':
    MINIO = decrypt_database_config(name="minio")
elif STORAGE_IMPL_TYPE == 'OSS':
    OSS = get_base_config("oss", {})

# 尝试加载Redis数据库配置，并在发生异常时提供默认值
try:
    REDIS = decrypt_database_config(name="redis")
except Exception:
    REDIS = {}
    pass
# 设置文档最大大小，默认为128MB，可通过环境变量MAX_CONTENT_LENGTH进行调整
DOC_MAXIMUM_SIZE = int(os.environ.get("MAX_CONTENT_LENGTH", 128 * 1024 * 1024))

# 队列和消费者组名称定义，用于任务分发和处理
SVR_QUEUE_NAME = "rag_flow_svr_queue"
SVR_CONSUMER_GROUP_NAME = "rag_flow_svr_task_broker"
PAGERANK_FLD = "pagerank_fea"
TAG_FLD = "tag_feas"

# 尝试检测可用的GPU数量，并记录到日志中，若无法导入torch，则仅记录警告信息
PARALLEL_DEVICES = None
try:
    import torch.cuda
    # 显卡数量
    PARALLEL_DEVICES = torch.cuda.device_count()
    logging.info(f"found {PARALLEL_DEVICES} gpus")
except Exception:
    logging.info("can't import package 'torch'")

# 定义函数print_rag_settings，输出RAG相关配置信息至日志，便于调试或查看当前设置
def print_rag_settings():
    # 记录文档最大长度限制的配置值
    logging.info(f"MAX_CONTENT_LENGTH: {DOC_MAXIMUM_SIZE}")
    # 从环境变量获取每个用户的最大文件数量限制，并记录到日志中，默认为0表示无限制
    logging.info(f"MAX_FILE_COUNT_PER_USER: {int(os.environ.get('MAX_FILE_NUM_PER_USER', 0))}")


# 根据优先级返回服务器队列名称，优先级为0时返回默认队列名，否则附加优先级标识
def get_svr_queue_name(priority: int) -> str:
    if priority == 0:
        return SVR_QUEUE_NAME
    return f"{SVR_QUEUE_NAME}_{priority}"

# 返回包含不同优先级的所有服务器队列名称列表
def get_svr_queue_names():
    return [get_svr_queue_name(priority) for priority in [1, 0]]
